import time
import random
import requests

from ciq.utils.crawler import save_export_keywords, export_info_exists
from ciq.utils.logger import Logger

'''
scripts/tbt_sps.py -> 中国WTO/TBT-SPS通报资讯网
'''

logger = Logger()
msg = 'Crawler: <scripts/tbt_sps.py>' 

site = '中国WTO/TBT-SPS通报资讯网'

pc_headers = {
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie': 'JSESSIONID=D7E8B710A5B3C31FD757A39E0405D5FF; Hm_lvt_c3cad961e24e7c819f04e848763682c6=1523935928; Hm_lpvt_c3cad961e24e7c819f04e848763682c6=1523936815',
    'Host': 'www.tbt-sps.gov.cn',
    'Origin': 'http://www.tbt-sps.gov.cn',
    'Referer': 'http://www.tbt-sps.gov.cn/tbtTbcx/getList.action',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
}

corpus = ('ABS树脂', 'CAS', 'CLP', 'ECHA', 'GHS', 'REACH', 'ROHS', 'SVHC', 'TDG', 'TDI', '一氧化碳', '一甲胺', '丁烷', '丁酮', '三乙胺', '三氧化硫', '三氯乙烯', '三氯甲烷', '三甲胺', '三硝基甲苯', '三聚氰胺', '三轮摩托车', '上光剂', '上衣', '不丹', '不饱和聚酯树脂', '丙烯腈', '丙烯酸', '丙烯酸酯', '丙烯醛', '丙烯颜料', '丙烷', '丙酮', '东帝汶', '两轮摩托车', '两轮脚踏自行车', '中国', '中密度纤维板', '中油圆珠笔', '中非', '丹麦', '主轴', '乌克兰', '乌兹别克斯坦', '乌干达', '乌拉圭', '乍得', '乒乓球', '乘用车', '乙二胺', '乙二醇', '乙烷', '乙苯', '乙酸', '乙酸钠', '乙酸钴', '乙醇汽油', '乙醚', '也门', '乳化炸药', '乳酸', '乳酸盐', '二乙烯苯', '二异丙醚', '二氧化硅', '二氧化硫', '二氧化碳', '二氧化钛', '二氧化锰', '二氯乙烯', '二氯乙烷', '二氯甲烷', '二氯苯酚', '二甲基萘', '二甲胺', '二硝基甲苯', '二硫化碳', '二苯卡巴肼', '二苯胺', '二苯酮', '二苯醚', '互感器', '五氧化二磷', '亚氯酸钠', '亚油酸', '亚洲', '亚硒酸', '亚硝酸钠', '亚磷酸', '亚美尼亚', '亚麻酸', '交流电动机', '产品标识', '人体模型', '人参', '以色列', '伊拉克', '伊朗', '传感器', '传播', '传染', '伯利兹', '佛得角', '俄罗斯', '俄罗斯联邦', '保加利亚', '保障措施', '保龄球', '修改', '修正带', '修正液', '修订', '健身球', '儿童三轮车', '儿童推车', '儿童自行车', '光学仪器', '光纤', '光缆', '克罗地亚', '党参', '全氟化碳', '八甲基环四硅氧烷', '六亚甲基四胺', '六氯苯', '内窥镜', '冈比亚', '农用薄膜', '冬虫夏草', '冰岛', '冲浪板', '冷轧薄宽钢带', '冷轧薄板', '冷阴极荧光灯', '几内亚', '凡士林', '出口受阻', '出血热', '列支敦士登', '刚果（金）', '利比亚', '利比里亚', '制定', '刺五加', '剃须用制剂', '剑道', '加工中心', '加拿大', '加热设备', '加纳', '加蓬', '动物模型', '动车组', '助听器', '匈牙利', '化妆品', '化妆类', '北美洲', '十二烷基苯', '十溴联苯醚', '千斤顶', '升降机', '半夏', '半挂牵引车', '半球', '单晶硅', '南极洲', '南美洲', '南苏丹', '南非', '博茨瓦纳', '卡塔尔', '卢旺达', '卢森堡', '卤钨灯', '印刷油墨', '印度', '印度尼西亚', '印油', '危化品', '危地马拉', '危险货物', '厄瓜多尔', '厄立特里亚', '压板', '压缩空气', '厚朴', '反倾销', '反应器', '反补贴', '发动机零部件', '发烟硫酸', '发电机', '发电机组', '变压器', '叙利亚', '古巴', '召回', '台布', '台湾', '台球桌', '合成氨', '合金结构钢', '吉他', '吉尔吉斯斯坦', '吉布提', '同轴电缆', '含砷', '呋喃酮', '哈萨克斯坦', '哑铃', '哥伦比亚', '哥斯达黎加', '喀麦隆', '喷雾器', '四氧化三钴', '四氯乙烯', '四聚乙醛', '回形针', '园艺产品', '围棋', '固体废弃物处理设备', '固体水彩画颜料', '固体胶', '固化剂', '图瓦卢', '圆珠笔', '土库曼斯坦', '土耳其', '圣卢西亚', '圣多美和普林西比', '圣文森特和格林纳丁斯', '圣马力诺', '圭亚那', '地热', '坦桑尼亚', '埃及', '埃塞俄比亚', '城市轨道车辆', '基里巴斯', '堆肥', '塑料制品', '塑料文具盒', '塑料玩偶', '塑料管', '塑料绳', '塑料编织布', '塑料编织袋', '塑料薄膜', '塑料袋', '塑料铅笔', '塑料零件', '塑料鞋', '塔吉克斯坦', '塞内加尔', '塞拉利昂', '塞浦路斯', '塞舌尔', '墨水', '墨西哥', '壁球拍', '复合微生物肥料', '复合木地板', '多哥', '多晶硅', '多米尼克', '多米尼加共和国', '大头针', '大洋洲', '大豆', '大麦', '天然水', '天花', '天麻', '太阳能电池板', '奥地利', '委内瑞拉', '姜黄素', '婴儿学步车', '孟加拉', '季戊四醇', '安哥拉', '安提瓜和巴布达', '定向刨花板', '定型剂', '定时器', '客车', '家兔', '家用洗衣机', '家用燃气用具', '对硝基苯胺', '对苯二甲酸', '对苯二胺', '导火索', '射击靶', '小扁豆', '小提琴', '小豆', '小麦', '尼加拉瓜', '尼日利亚', '尼日尔', '尼泊尔', '尿素', '展开调查', '山梨醇', '山茱萸', '工业机器人', '己二酸', '己内酰胺', '己烷', '巴勒斯坦', '巴基斯坦', '巴巴多斯', '巴布亚新几内亚', '巴拉圭', '巴拿马', '巴林', '巴西', '布', '布基纳法索', '布隆迪', '希腊', '帐篷', '带肋钢筋', '帽子', '干蚕豆', '干豇豆', '干豌豆', '床罩', '庚烷', '废止', '废物', '废蓄电池', '废除', '建筑模型', '建筑用塑料制品', '异丙胺', '引入', '引火线', '弹球机', '强化木', '当归', '微电机', '德国', '意大利', '戊烷', '戊肝', '房间空气调节器', '手帕', '手推车', '手机', '手风琴', '扑克牌', '打火机', '扣留', '执行器', '批准', '技术性贸易措施', '投影仪', '抗氧化剂', '抗静电剂', '护发素', '护手霜', '护肤品', '拉脱维亚', '拒绝进口', '拖拉机', '拟修改', '拟修订', '拳击手套', '挪威', '捷克', '授权物质清单', '搪瓷', '摩尔多瓦', '摩洛哥', '撤出市场', '数控机床功能部件', '文莱', '斐济', '斯威士兰', '斯洛伐克', '斯洛文尼亚', '斯里兰卡', '新加坡', '新增', '新西兰', '旋转木马', '无纺布', '无缝钢管', '日本', '旧服装', '明胶', '易燃易爆', '显微镜', '智利', '曲棍球', '有机磷', '朝鲜', '木桶', '木炭', '木球', '木琴', '木糖醇', '木薯', '机电类', '板条箱', '板球', '枕套', '枕巾', '枸杞', '柏木油', '染发剂', '柠檬黄', '柬埔寨', '柴油', '柴胡', '树脂酸', '核糖核酸', '格林纳达', '格陵兰', '格鲁吉亚', '桉叶油', '梅花鹿', '检出率', '检测设备', '检疫', '棉籽', '棒球手套', '棕榈酸', '模块', '橡皮', '橡胶', '橡胶手套', '橡胶输送带', '次氯酸', '次氯酸钙', '次氯酸钠', '欧洲', '欧盟', '比利时', '毛巾', '毛皮服装', '毛笔', '毛纱', '毛里塔尼亚', '毛里求斯', '气体发生器', '气球', '氟', '氢化松香', '氢化钠', '氢化锂', '氢气', '氢氟碳化物', '氢氧化钾', '氢氧化铁', '氢氧化镍', '氢氰酸', '氧化硼', '氧化钡', '氧化铁', '氧化银', '氧化锂', '氧化锌', '氧化锶', '氧气', '氨基脲', '氮气', '氯乙烯', '氯乙烷', '氯化汞', '氯化石蜡', '氯化苯', '氯化钙', '氯化钠', '氯化钾', '氯化铝', '氯化铵', '氯化锰', '氯化镁', '氯酸', '氯酸钠', '氯酸钾', '氰化钠', '水果', '水质污染防治设备', '汞', '汤加', '汽车车身', '汽轮机', '沉香', '沙特阿拉伯', '油树脂', '油橄榄果', '油污清洗剂', '油画棒', '油菜籽', '油酸', '沼气', '法国', '泡沫塑料', '波兰', '波多黎各', '波斯尼亚和黑塞哥维那', '泰国', '泵', '洗发剂', '洗面奶', '津巴布韦', '洪都拉斯', '活动铅笔', '活鸡', '流感', '流行', '测量仪器', '浴液', '海地', '涂层', '涂层板带', '消费者警告', '润唇膏', '溴丙烷', '溴甲烷', '溴酸', '溴酸钾', '滑动轴承', '滑梯', '滑雪鞋', '滚动轴承', '潜水装备', '澳大利亚', '澳门', '火炬', '灭火器', '灵芝', '炭疽', '热轧薄宽钢带', '热轧薄板', '焊接钢管', '焦煤', '煤焦油', '照相机', '燃料电池', '燃气轮机', '燕麦', '爆发', '爆竹', '爬行动物', '爱尔兰', '爱沙尼亚', '牙买加', '牙线', '牙膏', '牛', '特立尼达和多巴哥', '狂犬病', '狐', '猪', '玉米', '玩具电动机', '环己酮', '玻利维亚', '玻璃', '玻璃桌', '球棒', '琵琶', '瑞典', '瑞士', '瓦努阿图', '甘草', '甘蔗', '甘薯', '甜菜', '生地', '生奶', '生姜油', '生物有机肥', '生物柴油', '生皮', '甲基丙烯酸', '甲基丙烯酸酯', '甲基叔丁基醚', '甲烷', '甲肝', '甲苯', '甲苯胺', '甲酸', '甲酸钠', '甲醇汽油', '甲醚', '甲醛', '电动牙刷', '电动童车', '电子琴', '电子电器类', '电容器', '电机', '电梯', '电池类', '电源装置', '电热水器', '电焊机', '电能表', '电解铬', '电话单机', '疟疾', '痢疾', '癸二酸二辛酯', '登革热', '白俄罗斯', '白术', '白板', '白炽灯泡', '白芍', '百慕大', '皮棉', '盐酸', '直布罗陀', '眼镜片', '石油焦', '破伤风', '硅', '硅橡胶', '硅酸', '硝化棉', '硝基苯', '硝酸钙', '硝酸钠', '硝酸钡', '硝酸钾', '硝酸铅', '硝酸铵', '硝酸银', '硝酸锌', '硝酸锶', '硝酸镍', '硫代氨基甲酸酯', '硫化氢', '硫化钡', '硫酸', '硫酸铵', '硬脂酸', '硬脂酸铅', '硬脂酸镁', '硬质纤维板', '确诊', '硼', '硼氢化钾', '硼酸', '碳酸氢钠', '碳酸氢钾', '碳酸氢铵', '碳酸钡', '磨床', '磷化氢', '磷化铝', '磷酸一铵', '磷酸三甲苯酯', '磷酸三苯酯', '磷酸二铵', '禁止进口', '禁止销售', '离合器', '离子膜法烧碱', '离心机', '禽蛋', '秋千', '科威特', '科摩罗', '科特迪瓦', '秘鲁', '秸秆', '稀释剂', '稻谷', '突发', '突尼斯', '立陶宛', '竹地板', '竹木', '竹炭', '笛', '管夹', '箭', '籽棉', '粉笔', '粘合剂', '索马里', '红疹', '红花籽', '约旦', '纱', '纳米比亚', '纸和纸板', '纽埃', '线', '线材', '细木工板', '织机', '经纬仪', '绒线', '结束', '结核', '绝缘电线', '继电器', '绿豆', '缅甸', '缝纫机', '缝纫线', '网球', '网类制品', '罗马尼亚', '羊', '美国', '羽绒服装', '老挝', '联苯', '联轴器', '聚丙烯酸', '聚四氟乙烯', '聚氨酯泡沫塑料', '聚氯乙烯树脂', '聚甲基丙烯酸甲酯', '聚甲醛', '聚碳酸酯', '聚苯乙烯泡沫塑料', '聚酯', '肉桂醛', '肉苁蓉', '肌醇六磷酸', '肝炎', '肠胃炎', '肯尼亚', '肺炎', '胶水', '胶鞋', '脑膜炎', '脱模剂', '脱毛剂', '脱氧核糖核酸', '脱漆剂', '腺嘌呤', '致癌物', '航空汽油', '艾滋病', '芝麻', '芥子', '芦苇', '芬兰', '花生', '花露水', '芸豆', '苏丹', '苏里南', '苜蓿', '苯丙酮', '苯乙烯', '苯甲酸', '苯甲酸钠', '苯肼', '苯胺', '英国', '茯苓', '茶叶', '草种', '荞麦', '荧光灯', '荧光笔', '荷兰', '莫桑比克', '莱索托', '莲子', '菊花', '菲律宾', '萘', '萘磺酸', '萘磺酸甲醛缩合物', '萨尔瓦多', '萨摩亚', '葛根', '葡萄牙', '葵花籽', '蒙古', '蒸发残渣', '蒽醌', '蓄电池', '蔬菜', '薄荷酮', '薄荷醇', '蚕', '蚕丝', '蚕茧', '蜂', '蜡笔', '衬衫', '被罩', '裙', '裤', '西服套装', '西班牙', '视频设备', '计算机电源', '记号笔', '试验机', '贝宁', '贸易救济措施', '赞比亚', '赤道几内亚', '超氧化钠', '超氧化钾', '越南', '跑鞋', '蹦床', '车床', '转椅', '轮滑鞋', '软体沙发', '轻轨', '过山车', '过氧化苯甲酰', '过氧化钙', '过氧化钠', '过氧化钡', '过氧化钾', '过氧化锌', '过氧化锶', '过氧化镁', '过磷酸钙', '退回', '退市', '退货', '退运', '通报', '造林机械', '避孕套', '邻苯二甲酸丁苄酯', '邻苯二甲酸二丁酯', '邻苯二甲酸二异癸酯', '邻苯二甲酸二辛酯', '邻苯二甲酸酯', '酒石酸', '酚醛', '酯类', '酯胶', '重金属', '野生动物', '野生鸟类', '金属制品', '金属文具盒', '金属钝化剂', '金笔', '针织上衣', '针织内衣', '针织背心', '针织裙', '针织裤', '钙', '钙肥', '钛合金', '钛白粉', '钟', '钠', '钡', '钢板桩', '钢琴', '钢笔', '钢筋', '钾', '铁路机车', '铃兰醛', '铅笔', '铅粉', '铅酸蓄电池', '铝酸钠', '铣床', '铬', '铯', '银幕', '铸钢件', '铸铁件', '链球', '销毁', '锁阳', '锂', '锂离子电池', '锆粉', '锌', '锌灰', '锌粉', '锰酸钠', '锰酸钾', '锶', '锻件', '锻钢件', '镀层', '镀层板带', '镁肥', '镁铝合金', '镉', '门球', '间二甲苯', '间苯二酚', '阀门', '防冻剂', '防冻液', '防毒面具', '阿塞拜疆', '阿富汗', '阿尔及利亚', '阿尔巴尼亚', '阿曼', '阿根廷', '阿联酋', '限制物质', '限制物质清单', '除虫菊', '陶瓷', '隧道窑', '雪橇', '霍乱', '青饲料', '非洲', '韩国', '颁布', '领带', '风机', '风筝', '飞镖', '食品接触材料类', '食用菌', '香水', '香港', '香茅油', '香草醛', '香豆素', '马', '马其顿', '马尔代夫', '马拉维', '马来西亚', '马耳他', '马达加斯加', '马里', '马铃薯', '驯鹿', '驴', '骆驼', '骡', '骨胶', '高关注度物质', '高尔夫球', '高氯酸', '高氯酸钾', '高氯酸铵', '高粱', '高锰酸钠', '高锰酸钾', '高锰酸钾消耗量', '鸟粪', '鹰嘴豆', '麝', '麦冬', '麻疹', '黄热病', '黄磷', '黄芩', '黄芪', '黄连', '黎巴嫩', '黑板', '黑麦', '齿轮', '龙头',)


# 关键词提取算法
def extract_keywords(text, country):
    keywords = [country, ]
    for key in corpus:
        if text.find(key) != -1:
            keywords.append(key)

    return keywords


# 数据存在校验(LOCAL)
def is_exists(url):
    return export_info_exists(url)


def first(url, page, page_type, tbtsps):
    params = {
        'sum': '',
        'indexmap': '',
        'indexType': '',
        'pageType': page_type,
        'tbtsps': tbtsps,
        'lm': 0,
        'gjz': '',
        'ProductsCovered': '',
        'TBMembers': '',
        'DIC_AREA_NAME': '',
        'school': '',
        'ics1': '',
        'ICSCode': '',
        'ICSCodeName': '',
        'purposereason': '',
        'TBDATE_QS': '',
        'TBDATE_JZ': '',
        'currPage': page,
        # 'maxPage': 1783,
        # 'total': 26733,
        'urlParam': 'tbtTbcx',
        'isPage': 'y',
    }
    resp = requests.post(url, params=params, headers=pc_headers)
    return resp.json()['listStr']


def second(url, mid, tbtype):
    params = {
        'mid': mid,
        'TBType': tbtype,
    }

    resp = requests.get(url, params=params, headers=pc_headers)



def process(page_type, tbtsps):
    page = 0
    while True:
        lists = first('http://www.tbt-sps.gov.cn/tbtTbcx/getListTbcx.action', page, page_type, tbtsps)
        for l in lists:
            pubtime = l['tbdate']
            number = l['tbtno']
            title = l['tbtitle']
            country = l['gjname']
            category = 'tbt' if tbtsps == 1 else 'sps'

            tbtype = l['tbtype']
            tbid = l['tbid']

            url = 'http://www.tbt-sps.gov.cn/tbtTbcx/getTbcxContent.action?mid=%s&TBType=%s' % (tbid, tbtype, )

            if is_exists(url):
                continue

            # 提取关键词
            keywords = extract_keywords(title, country)
            # 数据入库
            save_export_keywords(
                keywords,
                '{0}...'.format(title[:252]) if len(title) > 250 else title,
                url,
                pubtime,
                site,
                category, 
                country,
            )

        page += 1
        time.sleep(10)


def run():
    params = [
                {'page_type': 0, 'tbtsps': 1},
                {'page_type': 2, 'tbtsps': 2}
            ]

    # 持续抓取
    while True:
        param = random.choice(params)

        try:
            process(param['page_type'], param['tbtsps'])
            time.sleep(6 * 60 * 60)
        except Exception as e:
            logger.record('%s, Line: 131, %s' % (msg, e, ), lt='ERROR')
            time.sleep(1 * 60 * 60)
